package top.gangster.lunan.contractservice.service.impl;

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.mysql.cj.util.StringUtils;
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import top.gangster.lunan.contractservice.entity.Contract;
import top.gangster.lunan.contractservice.entity.ContractField;
import top.gangster.lunan.contractservice.mapper.ContractMapper;
import top.gangster.lunan.contractservice.service.ContractFieldService;
import top.gangster.lunan.contractservice.service.ContractService;

/**
 * <p>
 * 合同的所有信息 服务实现类
 * </p>
 *
 * @author kid
 * @since 2021-11-11
 */
@Service
public class ContractServiceImpl extends ServiceImpl<ContractMapper, Contract> implements ContractService {
	@Autowired
	ContractFieldService fieldService;

	/**
	 * 根据所属合同id查找出所有合同字段
	 * @param contractID 合同id
	 * @return 所有合同
	 */
	@Override
	public List<ContractField> getFieldsOfContractId(String contractID) {
		return fieldService.getFieldsOfContract(contractID);
	}

	/**
	 * 查询指定id合同
	 * @param contractId 合同id
	 * @return 指定id合同
	 */
	@Override
	public Contract getContract(String contractId) {
		return this.getById(contractId);
	}

	/**
	 * 根据合同名进行模糊分页查询
	 * @param current 当前页
	 * @param limit   页大小
	 * @param name    模糊匹配文件名
	 * @return 模糊分页查询结果
	 */
	@Override
	public Page<Contract> getContract(Long current, Long limit, String name) {
		Page<Contract> page = new Page<>(current, limit);
		QueryWrapper<Contract> wrapper = new QueryWrapper<>();
		if (!StringUtils.isEmptyOrWhitespaceOnly(name)) {
			wrapper.like("name",name);
		}
		return (Page<Contract>) this.page(page, wrapper);
	}

	/**
	 * 查找出所有该类型的合同
	 * @param contractTypeId 合同类型id
	 * @return 该类型的所有合同
	 */
	@Override
	public List<Contract> getContractByTypeId(Integer contractTypeId) {
		QueryWrapper<Contract> wrapper = new QueryWrapper<>();
		wrapper.eq("contract_type_id",contractTypeId);
		return this.list(wrapper);
	}

	/**
	 * 分页查询该类型的合同
	 * @param contractTypeId 合同类型id
	 * @param current        当前页
	 * @param limit          页大小
	 * @return 分页查询结果
	 */
	@Override
	public Page<Contract> getContractByTypeId(Integer contractTypeId, Long current, Long limit) {
		Page<Contract> page = new Page<>(current, limit);
		QueryWrapper<Contract> wrapper = new QueryWrapper<>();
		wrapper.eq("contract_type_id",contractTypeId);
		return (Page<Contract>) this.page(page, wrapper);
	}

	/**
	 * 根据合同状态id查询所有合同
	 * @param contractStateId 合同状态id
	 * @return 该状态的所有合同
	 */
	@Override
	public List<Contract> getContractByStateId(Integer contractStateId) {
		QueryWrapper<Contract> wrapper = new QueryWrapper<>();
		wrapper.eq("state_id",contractStateId);
		return this.list(wrapper);
	}

	/**
	 * 分页查询该状态的合同
	 * @param contractStateId 合同状态id
	 * @param current         当前页
	 * @param limit           页大小
	 * @return 分页查询结果
	 */
	@Override
	public Page<Contract> getContractByStateId(Integer contractStateId, Long current, Long limit) {
		Page<Contract> page = new Page<>(current, limit);
		QueryWrapper<Contract> wrapper = new QueryWrapper<>();
		wrapper.eq("state_id",contractStateId);
		return (Page<Contract>) this.page(page, wrapper);
	}


	/**
	 * 指定某个合同模板id，将合同模板字段作为该模板的字段保存在数据库
	 * @param contractId 所属合同模板的id
	 * @param fields     合同模板字段
	 * @return is saved?
	 */
	@Override
	public boolean saveFields(String contractId, List<ContractField> fields) {
		if (fields == null) {
			return true;
		}
		for (ContractField field : fields) {
			field.setContractId(contractId);
		}
		return fieldService.saveBatch(fields);
	}

	/**
	 * 根据合同文件id删除其所有合同字段
	 * @param id 合同文件id
	 * @return 是否成功删除
	 */
	@Override
	public boolean removeFieldsByContractId(String id) {
		QueryWrapper<ContractField> wrapper = new QueryWrapper<>();
		wrapper.eq("contract_id",id);
		return fieldService.remove(wrapper);
	}

	/**
	 * 根据合同文件id更新合同文件
	 * @param contract 合同文件
	 * @return is updated?
	 */
	@Override
	public boolean updateContract(Contract contract) {
		return this.updateById(contract);
	}
}
